We show that the low-level programming and hardware emulation in general coupled 
with a functional paradigm of a high-level language like Haskell is indeed 
possible to achieve. 

Haskell being a powerful, pure and type-safe language provides high abstraction 
and enables easy modeling of the hardware in question where different components 
are modular and decoupled from each other for simplicity and high readability.

Our chosen hardware to-be emulated is the highly popular 8-bit 
\textit{Nintendo Entertainment System} (NES) console from the 1983 with a lot of 
effort put in to make the code simple, modular, extendable and if possible and 
time permitting efficient, meaning matching original hardware in speed.

The results in this project show clearly how emulation can be made easy using 
ADTs, Monads, and lazy lists. Haskell being lazy however, has made it 
hard to make the code run fast. That has been mostly due to time constraint.
